/**
 * @file 微信小程序JSAPI
 * @author 崔健 cuijian03@baidu.com 2017.01.10
 * @update 邓淑芳 623996689@qq.com 2019.07.03
 */

/**
 * 百度地图微信小程序API类
 *
 * @class
 */
class BMapWX {
  /**
   * 百度地图微信小程序API类
   *
   * @constructor
   */
  constructor(param) {
    this.ak = param["ak"];
  }
  /**
   * 使用微信接口进行定位
   *
   * @param {string} type 坐标类型
   * @param {Function} success 成功执行
   * @param {Function} fail 失败执行
   * @param {Function} complete 完成后执行
   */


  getWXLocation(type, success, fail, complete) {
    type = type || 'gcj02', success = success || function () {};

    fail = fail || function () {};

    complete = complete || function () {};

    uni.getLocation({
      type: type,
      success: success,
      fail: fail,
      complete: complete
    });
  }
  /**
   * POI周边检索
   *
   * @param {Object} param 检索配置
   * 参数对象结构可以参考
   * http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi
   */


  search(param) {
    var that = this;
    param = param || {};
    let searchparam = {
      query: param["query"] || '生活服务$美食&酒店',
      scope: param["scope"] || 1,
      filter: param["filter"] || '',
      coord_type: param["coord_type"] || 2,
      page_size: param["page_size"] || 10,
      page_num: param["page_num"] || 0,
      output: param["output"] || 'json',
      ak: that.ak,
      sn: param["sn"] || '',
      timestamp: param["timestamp"] || '',
      radius: param["radius"] || 2000,
      ret_coordtype: 'gcj02ll'
    };
    let otherparam = {
      iconPath: param["iconPath"],
      iconTapPath: param["iconTapPath"],
      width: param["width"],
      height: param["height"],
      alpha: param["alpha"] || 1,
      success: param["success"] || function () {},
      fail: param["fail"] || function () {}
    };
    let type = 'gcj02';

    let locationsuccess = function (result) {
      searchparam["location"] = result["latitude"] + ',' + result["longitude"];
      uni.request({
        url: 'https://api.map.baidu.com/place/v2/search',
        data: searchparam,
        header: {
          "content-type": "application/json"
        },
        method: 'GET',

        success(data) {
          let res = data["data"];

          if (res["status"] === 0) {
            let poiArr = res["results"]; // outputRes 包含两个对象，
            // originalData为百度接口返回的原始数据
            // wxMarkerData为小程序规范的marker格式

            let outputRes = {};
            outputRes["originalData"] = res;
            outputRes["wxMarkerData"] = [];

            for (let i = 0; i < poiArr.length; i++) {
              outputRes["wxMarkerData"][i] = {
                id: i,
                latitude: poiArr[i]["location"]["lat"],
                longitude: poiArr[i]["location"]["lng"],
                title: poiArr[i]["name"],
                iconPath: otherparam["iconPath"],
                iconTapPath: otherparam["iconTapPath"],
                address: poiArr[i]["address"],
                telephone: poiArr[i]["telephone"],
                alpha: otherparam["alpha"],
                width: otherparam["width"],
                height: otherparam["height"]
              };
            }

            otherparam.success(outputRes);
          } else {
            otherparam.fail({
              errMsg: res["message"],
              statusCode: res["status"]
            });
          }
        },

        fail(data) {
          otherparam.fail(data);
        }

      });
    };

    let locationfail = function (result) {
      otherparam.fail(result);
    };

    let locationcomplete = function (result) {};

    if (!param["location"]) {
      that.getWXLocation(type, locationsuccess, locationfail, locationcomplete);
    } else {
      let longitude = param.location.split(',')[1];
      let latitude = param.location.split(',')[0];
      let errMsg = 'input location';
      let res = {
        errMsg: errMsg,
        latitude: latitude,
        longitude: longitude
      };
      locationsuccess(res);
    }
  }
  /**
   * sug模糊检索
   *
   * @param {Object} param 检索配置
   * 参数对象结构可以参考
   * http://lbsyun.baidu.com/index.php?title=webapi/place-suggestion-api
   */


  suggestion(param) {
    var that = this;
    param = param || {};
    let suggestionparam = {
      query: param["query"] || '',
      region: param["region"] || '全国',
      city_limit: param["city_limit"] || false,
      output: param["output"] || 'json',
      ak: that.ak,
      sn: param["sn"] || '',
      timestamp: param["timestamp"] || '',
      ret_coordtype: 'gcj02ll'
    };
    let otherparam = {
      success: param["success"] || function () {},
      fail: param["fail"] || function () {}
    };
    uni.request({
      url: 'https://api.map.baidu.com/place/v2/suggestion',
      data: suggestionparam,
      header: {
        "content-type": "application/json"
      },
      method: 'GET',

      success(data) {
        let res = data["data"];

        if (res["status"] === 0) {
          otherparam.success(res);
        } else {
          otherparam.fail({
            errMsg: res["message"],
            statusCode: res["status"]
          });
        }
      },

      fail(data) {
        otherparam.fail(data);
      }

    });
  }
  /**
   * rgc检索（逆地理编码：经纬度->地点描述）
   * 
   * @param {Object} param 检索配置
   * 参数对象结构可以参考
   * https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad
   * 
   */


  regeocoding(param) {
    var that = this;
    param = param || {};
    let regeocodingparam = {
      coordtype: param["coordtype"] || 'gcj02ll',
      ret_coordtype: 'gcj02ll',
      radius: param["radius"] || 1000,
      ak: that.ak,
      sn: param["sn"] || '',
      output: param["output"] || 'json',
      callback: param["callback"] || function () {},
      extensions_poi: param["extensions_poi"] || 1,
      extensions_road: param["extensions_road"] || false,
      extensions_town: param["extensions_town"] || false,
      language: param["language"] || 'zh-CN',
      language_auto: param["language_auto"] || 0
    };
    let otherparam = {
      iconPath: param["iconPath"],
      iconTapPath: param["iconTapPath"],
      width: param["width"],
      height: param["height"],
      alpha: param["alpha"] || 1,
      success: param["success"] || function () {},
      fail: param["fail"] || function () {}
    };
    let type = 'gcj02';

    let locationsuccess = function (result) {
      regeocodingparam["location"] = result["latitude"] + ',' + result["longitude"];
      uni.request({
        url: 'https://api.map.baidu.com/reverse_geocoding/v3',
        data: regeocodingparam,
        header: {
          "content-type": "application/json"
        },
        method: 'GET',

        success(data) {
          let res = data["data"];

          if (res["status"] === 0) {
            let poiObj = res["result"]; // outputRes 包含两个对象：
            // originalData为百度接口返回的原始数据
            // wxMarkerData为小程序规范的marker格式

            let outputRes = {};
            outputRes["originalData"] = res;
            outputRes["wxMarkerData"] = [];
            outputRes["wxMarkerData"][0] = {
              id: 0,
              latitude: result["latitude"],
              longitude: result["longitude"],
              address: poiObj["formatted_address"],
              iconPath: otherparam["iconPath"],
              iconTapPath: otherparam["iconTapPath"],
              desc: poiObj["sematic_description"],
              business: poiObj["business"],
              alpha: otherparam["alpha"],
              width: otherparam["width"],
              height: otherparam["height"]
            };
            otherparam.success(outputRes);
          } else {
            otherparam.fail({
              errMsg: res["message"],
              statusCode: res["status"]
            });
          }
        },

        fail(data) {
          otherparam.fail(data);
        }

      });
    };

    let locationfail = function (result) {
      otherparam.fail(result);
    };

    let locationcomplete = function (result) {};

    if (!param["location"]) {
      that.getWXLocation(type, locationsuccess, locationfail, locationcomplete);
    } else {
      let longitude = param.location.split(',')[1];
      let latitude = param.location.split(',')[0];
      let errMsg = 'input location';
      let res = {
        errMsg: errMsg,
        latitude: latitude,
        longitude: longitude
      };
      locationsuccess(res);
    }
  }
  /**
   * gc检索（地理编码：地点->经纬度）
   *
   * @param {Object} param 检索配置
   * 参数对象结构可以参考
   * https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding
   * 
   */


  geocoding(param) {
    var that = this;
    param = param || {};
    let geocodingparam = {
      address: param["address"] || '',
      city: param["city"] || '',
      ret_coordtype: param["coordtype"] || 'gcj02ll',
      ak: that.ak,
      sn: param["sn"] || '',
      output: param["output"] || 'json',
      callback: param["callback"] || function () {}
    };
    let otherparam = {
      iconPath: param["iconPath"],
      iconTapPath: param["iconTapPath"],
      width: param["width"],
      height: param["height"],
      alpha: param["alpha"] || 1,
      success: param["success"] || function () {},
      fail: param["fail"] || function () {}
    };

    if (param["address"]) {
      uni.request({
        url: 'https://api.map.baidu.com/geocoding/v3',
        data: geocodingparam,
        header: {
          "content-type": "application/json"
        },
        method: 'GET',

        success(data) {
          let res = data["data"];

          if (res["status"] === 0) {
            let poiObj = res["result"]; // outputRes 包含两个对象：
            // originalData为百度接口返回的原始数据
            // wxMarkerData为小程序规范的marker格式

            let outputRes = res;
            outputRes["originalData"] = res;
            outputRes["wxMarkerData"] = [];
            outputRes["wxMarkerData"][0] = {
              id: 0,
              latitude: poiObj["location"]["lat"],
              longitude: poiObj["location"]["lng"],
              iconPath: otherparam["iconPath"],
              iconTapPath: otherparam["iconTapPath"],
              alpha: otherparam["alpha"],
              width: otherparam["width"],
              height: otherparam["height"]
            };
            otherparam.success(outputRes);
          } else {
            otherparam.fail({
              errMsg: res["message"],
              statusCode: res["status"]
            });
          }
        },

        fail(data) {
          otherparam.fail(data);
        }

      });
    } else {
      let errMsg = 'input address!';
      let res = {
        errMsg: errMsg
      };
      otherparam.fail(res);
    }
  }
  /**
   * 天气检索
   *
   * @param {Object} param 检索配置
   */


  weather(param) {
    var that = this;
    param = param || {};
    let weatherparam = {
      coord_type: param["coord_type"] || 'gcj02',
      output: param["output"] || 'json',
      ak: that.ak,
      sn: param["sn"] || '',
      timestamp: param["timestamp"] || ''
    };
    let otherparam = {
      success: param["success"] || function () {},
      fail: param["fail"] || function () {}
    };
    let type = 'gcj02';

    let locationsuccess = function (result) {
      weatherparam["location"] = result["longitude"] + ',' + result["latitude"];
      uni.request({
        url: 'https://api.map.baidu.com/telematics/v3/weather',
        data: weatherparam,
        header: {
          "content-type": "application/json"
        },
        method: 'GET',

        success(data) {
          let res = data["data"];

          if (res["error"] === 0 && res["status"] === 'success') {
            let weatherArr = res["results"]; // outputRes 包含两个对象，
            // originalData为百度接口返回的原始数据
            // wxMarkerData为小程序规范的marker格式

            let outputRes = {};
            outputRes["originalData"] = res;
            outputRes["currentWeather"] = [];
            outputRes["currentWeather"][0] = {
              currentCity: weatherArr[0]["currentCity"],
              pm25: weatherArr[0]["pm25"],
              date: weatherArr[0]["weather_data"][0]["date"],
              temperature: weatherArr[0]["weather_data"][0]["temperature"],
              weatherDesc: weatherArr[0]["weather_data"][0]["weather"],
              wind: weatherArr[0]["weather_data"][0]["wind"]
            };
            otherparam.success(outputRes);
          } else {
            otherparam.fail({
              errMsg: res["message"],
              statusCode: res["status"]
            });
          }
        },

        fail(data) {
          otherparam.fail(data);
        }

      });
    };

    let locationfail = function (result) {
      otherparam.fail(result);
    };

    let locationcomplete = function (result) {};

    if (!param["location"]) {
      that.getWXLocation(type, locationsuccess, locationfail, locationcomplete);
    } else {
      let longitude = param.location.split(',')[0];
      let latitude = param.location.split(',')[1];
      let errMsg = 'input location';
      let res = {
        errMsg: errMsg,
        latitude: latitude,
        longitude: longitude
      };
      locationsuccess(res);
    }
  }

}

module.exports.BMapWX = BMapWX;